#pragma once
#include <iostream>
#include <string>
#include <map>
#include "JsonHandler.h"
#include "Product.h"
#include "ShoppingCart.h"
#include "Order.h"
/*
实现功能：

    3) 余额管理：支持用户账号中余额的查询、充值、消费等。
    */
// 声明一下使用的类，因为报错了。。。
class UserController;
class ProductController;
class ShoppingCart;
class Order;

class User
{
private:
    int id;
    string username, password;
    double balance; // 账户余额

public:
    virtual ~User() = default;
    virtual string getUsertype() const = 0;

    void recharge(double amount)
    {
        balance += amount;
    }
    void deduct(double amount)
    {
        balance -= amount;
    }

    // 这里不再做检查因为用户名和密码的改变是经过用户管理类的检查的
    void setId(int newId) { id = newId; }
    void setUsername(string newName) { username = newName; }
    void setPassword(string newPW) { password = newPW; }
    void setBalance(double newBalance) { balance = newBalance; }

    int getId() const { return id; }
    string getUsername(void) const { return username; }
    double getBalance() const { return balance; }
    
};

class Seller : public User
{
    //std::vector<Order> orderHistory;

public:
    Seller(int id, UserController &userC);
    string getUsertype() const override { return "Seller"; }

    //void displaySalesHistory() const;

};

/*

    添加商品：支持商家添加新商品，要求已添加的商品信息长久保留。*/
class Customer : public User
{
    ShoppingCart shoppingCart;
    std::vector<Order> unpayedOrders; //未支付的订单
    //std::vector<Order> salesHistory; //暂时先不实现


public:
    Customer(int id, UserController &userC, ProductController &productCtrl);
    string getUsertype() const override { return "Customer"; }

    const ShoppingCart &getShoppingCart() const { return shoppingCart; }
    const std::vector<Order> &getUnpaidOrders() const { return unpayedOrders; }

    //void addOrderToHistory(const Order& newOrder);
    //void displayOrderHistory() const;

};

// 用户管理类，用来支持用户的登录、注册和文件的读写
/**
 *  1) 用户注册&登录：支持新用户注册平台账号，已注册用户用平台账号登录平台，要求已注册用户的信息长久保留。
    2) 修改账户密码：支持登录后对用户账号的密码修改。
 */
/*
user.json为一个数组文件
[
    {
        "id" : 1,   //id没有0，从一开始的
        "name" : "gxq",
        "password" : "123456",
        "usertype" : "Seller",
        "balance" : 123.123,
        "cart" : [{
            "productId" : "p001",
            "quantity" : 2
        }],
        "unpaidOrders" : [{
            "orderId" : "",
            [{
                "productId" : "p001",
                "productName" : "商品1",
                "quantity" : 2,
                "unitPrice" : 50.0,
                "sellerId" : 2
            }],
            "totalAmount" : 100.0,
            "status" : "UNPAID",
            "orderTime" : "2023-10-01T12:00:00Z"
        }],
        "orderHistory" : []
    },
    {...}
]
*/
class UserController
{
private:
    string usersFile = "data/users.json";
    json users = json::array();
    map<int, string> id_usernames;
    map<int, string> id_passwords;
    map<int, double> id_balance;
    map<int, string> id_usertype;
    int lastId = 0;

    // 文件读写支持
    void openUserFile(void);


public:
    UserController();
    ~UserController();
    bool changePassword(const int &id, const string &newPW);
    bool setUsername(const int &id, const string &newUN);
    void saveUserData(void) const;
    bool isUserNameExist(const string &name) const;
    bool isUsernameValid(const string &UN) const; // 判断有无重复名字（3-18位字母或数字）
    bool isPasswordValid(const string &PW) const; // 判断输入密码是否合法（5-12位字母或数字）
    bool rechargeBalance(const int &id, const double &amount)
    {
        if (id_balance.count(id))
        {
            id_balance[id] += amount;
            for (auto &user_obj : users)
            {
                if (user_obj.is_object() && user_obj.contains("id") && user_obj["id"].get<int>() == id)
                {
                    user_obj["balance"] = id_balance[id];
                    break; // 找到并更新后即可退出循环
                }
            }
            saveUserData(); // 实时保存用户数据到文件
            return true;
        }
        else
        {
            cout << "用户ID " << id << " 不存在，无法充值。" << endl;
            return false;
        }
    }
    bool withdrawBalance(const int &id, const double &amount)
    {
        if (id_balance.count(id))
        {
            if (id_balance[id] >= amount)
            {
                id_balance[id] -= amount;
                for (auto &user_obj : users)
                {
                    if (user_obj.is_object() && user_obj.contains("id") && user_obj["id"].get<int>() == id)
                    {
                        user_obj["balance"] = id_balance[id];
                        break;
                    }
                }
                saveUserData(); // 实时保存用户数据到文件
                cout << "扣款成功！当前余额为: ¥" << id_balance[id] << endl;
                return true;
            }
            else
            {
                cout << "余额不足，无法提现。" << endl;
                return false;
            }
        }
        else
        {
            cout << "用户ID " << id << " 不存在，无法提现。" << endl;
            return false;
        }
    }

    string findUsername(const int id) const
    {
        auto it = id_usernames.find(id);
        if (it != id_usernames.end())
        {
            return it->second;
        }
        else
        {
            cout << "用户ID " << id << " 不存在。" << endl;
            return "";
        }
    }


    json getUserDataById(int id) const;
    double getBalanceById(const int id) const
    {
        auto it = id_balance.find(id);
        if (it != id_balance.end())
        {
            return it->second;
        }
        else
        {
            cout << "用户ID " << id << " 不存在。" << endl;
            return 0.0; // 或者抛出异常
        }
    }
    string getPasswordById(const int id) const
    {
        auto it = id_passwords.find(id);
        if (it != id_passwords.end())
        {
            return it->second;
        }
        else
        {
            cout << "用户ID " << id << " 不存在。" << endl;
            return ""; // 或者抛出异常
        }
    }

    void syncCustomerState(const Customer &customer);
    std::pair<int, string> toLogin(const string inputName, const string inputPassword) const;
    int toRegister(const string inputName, const string inputPassword, const string inputUsertype);
    void displayAllUsersDebug() const;

    // 处理登录请求，返回包含用户信息的JSON
    json handleLogin(const std::string &username, const std::string &password);

    // 处理注册请求
    json handleRegister(const std::string &username, const std::string &password, const std::string &userType);

    // 处理添加购物车请求
    json handleAddToCart(int userId, const std::string &productId, int quantity, ProductController &productCtrl);

    // 处理获取购物车请求
    json handleGetCart(int userId, ProductController &productCtrl);

    // 处理生成订单请求
    json handleCreateOrder(int userId, ProductController &productCtrl);

    // 处理支付订单请求
    json handlePayOrder(int userId, const std::string &orderId, ProductController &productCtrl);

    // 处理更新购物车商品数量的请求
    json handleUpdateCartItem(int userId, const std::string &productId, int newQuantity, ProductController &productCtrl);

    // 处理清空购物车的请求
    json handleClearCart(int userId);

    // 处理充值请求
    json handleRecharge(int userId, double amount);

    json handleCancelOrder(int userId, const std::string &orderId, ProductController &productCtrl);

    json handleGetUnpaidOrders(int userId);

};

